package com.lekang.dto;

import com.lekang.domain.BillDetail;
import com.lekang.common.annotation.Excel;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 新增账单DTO（接收前端传递的账单主信息 + 嵌套账单详情列表，用于一对多数据保存）
 * 对应数据库表：bill（主表）、bill_detail（子表）
 * @author wangjinyuan
 * @date 2025年10月20日
 */
public class AddBillDto {

    // -------------------------- 账单主表（bill）相关字段 --------------------------
    /** 主键ID（新增时前端无需传递，后端自增生成） */
    @Excel(name = "主键ID")
    private Long id;

    /** 账单编号（前端可传，后端也可自动生成；若前端不传，后端需补充生成逻辑） */
    @Excel(name = "账单编号")
    private String billNo;

    /** 账单类型（如：月度账单、临时账单，建议值："MONTHLY"/"TEMPORARY"） */
    @Excel(name = "账单类型")
    private String billType;

    /** 账单月份（格式：yyyy-MM，如 "2025-10"，前端需按此格式传递） */
    @Excel(name = "账单月份")
    private String billMonth;

    /** 老人外键编号（关联 elderly 表的 id，前端必须传递，非空） */
    @Excel(name = "老人外键编号")
    private Long elderlyId;

    /** 每月应付（新增时前端无需传递，后端根据账单详情计算生成） */
    @Excel(name = "每月应付")
    private BigDecimal monthlyPayable;

    /** 本期应付（新增时前端无需传递，后端根据账单详情计算生成） */
    @Excel(name = "本期应付")
    private BigDecimal currentPayable;

    /** 预交款支付金额（前端可选传递，无则为0） */
    @Excel(name = "预交款支付金额")
    private BigDecimal prepaymentAmount;

    /** 账单金额（新增时前端无需传递，后端根据账单详情计算生成：添加项总和 - 扣减项总和） */
    @Excel(name = "账单金额")
    private BigDecimal billAmount;

    /** 应付金额（新增时前端无需传递，默认等于 billAmount） */
    @Excel(name = "应付金额")
    private BigDecimal payableAmount;

    /** 支付截止日期（前端需传递，格式：yyyy-MM-dd） */
    @Excel(name = "支付截止日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date paymentDeadline;

    /** 交易状态（新增时前端无需传递，后端默认赋值："UNPAID" 表示未支付） */
    @Excel(name = "交易状态")
    private String transactionStatus;

    /** 账单开始时间（前端可选传递，如月度账单：2025-10-01 00:00:00；若不传，后端可按账单月份自动生成） */
    @Excel(name = "账单开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date billStartTime;

    /** 账单结束时间（前端可选传递，如月度账单：2025-10-31 23:59:59；若不传，后端可按账单月份自动生成） */
    @Excel(name = "账单结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date billEndTime;

    /**
     * 创建人ID（前端必须传递，关联 sys_user 表的 user_id，用于记录账单创建人）
     * （原逻辑：后端获取，现调整为前端传递）
     */
    private Long creator;

    /** 创建时间（前端无需传递，后端自动填充当前时间） */
    private Date createTime;

    /** 支付渠道（前端可选传递，如："ALIPAY"/"WECHAT"/"CASH"） */
    @Excel(name = "支付渠道")
    private String paymentChannel;

    /** 支付方式（前端可选传递，如："ONLINE_PAY"/"OFFLINE_PAY"） */
    @Excel(name = "支付方式")
    private String paymentMethod;

    /** 支付凭证图片（前端可选传递，如图片URL路径；仅支付后需传递） */
    @Excel(name = "支付凭证图片")
    private String paymentVoucher;

    /** 支付备注（前端可选传递，如用户备注信息） */
    @Excel(name = "支付备注")
    private String paymentRemark;

    /** 取消原因（新增时无需传递，仅账单取消时使用） */
    @Excel(name = "取消原因")
    private String cancelReason;

    /** 关联订单（前端可选传递，如关联的入住订单编号） */
    @Excel(name = "关联订单")
    private String relatedOrder;

    /** 额外字段1（前端可选传递，按业务需求使用） */
    @Excel(name = "额外字段1")
    private String extraField1;

    /** 额外字段2（前端可选传递，按业务需求使用） */
    @Excel(name = "额外字段2")
    private String extraField2;


    // -------------------------- 嵌套账单详情列表（一对多核心） --------------------------
    /**
     * 账单详情列表（对应 bill_detail 表，前端传递的添加项/扣减项均存于此列表）
     * 要求：至少包含1条详情，每条详情需明确 type（"添加项"/"扣减项"）、itemName、amount
     */
    private List<BillDetail> billDetails;


    // -------------------------- 手动编写所有字段的 Getter/Setter 方法 --------------------------
    // 1. 账单主表字段 Getter/Setter
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getBillNo() {
        return billNo;
    }

    public void setBillNo(String billNo) {
        this.billNo = billNo;
    }

    public String getBillType() {
        return billType;
    }

    public void setBillType(String billType) {
        this.billType = billType;
    }

    public String getBillMonth() {
        return billMonth;
    }

    public void setBillMonth(String billMonth) {
        this.billMonth = billMonth;
    }

    public Long getElderlyId() {
        return elderlyId;
    }

    public void setElderlyId(Long elderlyId) {
        this.elderlyId = elderlyId;
    }

    public BigDecimal getMonthlyPayable() {
        return monthlyPayable;
    }

    public void setMonthlyPayable(BigDecimal monthlyPayable) {
        this.monthlyPayable = monthlyPayable;
    }

    public BigDecimal getCurrentPayable() {
        return currentPayable;
    }

    public void setCurrentPayable(BigDecimal currentPayable) {
        this.currentPayable = currentPayable;
    }

    public BigDecimal getPrepaymentAmount() {
        return prepaymentAmount;
    }

    public void setPrepaymentAmount(BigDecimal prepaymentAmount) {
        this.prepaymentAmount = prepaymentAmount;
    }

    public BigDecimal getBillAmount() {
        return billAmount;
    }

    public void setBillAmount(BigDecimal billAmount) {
        this.billAmount = billAmount;
    }

    public BigDecimal getPayableAmount() {
        return payableAmount;
    }

    public void setPayableAmount(BigDecimal payableAmount) {
        this.payableAmount = payableAmount;
    }

    public Date getPaymentDeadline() {
        return paymentDeadline;
    }

    public void setPaymentDeadline(Date paymentDeadline) {
        this.paymentDeadline = paymentDeadline;
    }

    public String getTransactionStatus() {
        return transactionStatus;
    }

    public void setTransactionStatus(String transactionStatus) {
        this.transactionStatus = transactionStatus;
    }

    public Date getBillStartTime() {
        return billStartTime;
    }

    public void setBillStartTime(Date billStartTime) {
        this.billStartTime = billStartTime;
    }

    public Date getBillEndTime() {
        return billEndTime;
    }

    public void setBillEndTime(Date billEndTime) {
        this.billEndTime = billEndTime;
    }

    public Long getCreator() {
        return creator;
    }

    public void setCreator(Long creator) {
        this.creator = creator;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getPaymentChannel() {
        return paymentChannel;
    }

    public void setPaymentChannel(String paymentChannel) {
        this.paymentChannel = paymentChannel;
    }

    public String getPaymentMethod() {
        return paymentMethod;
    }

    public void setPaymentMethod(String paymentMethod) {
        this.paymentMethod = paymentMethod;
    }

    public String getPaymentVoucher() {
        return paymentVoucher;
    }

    public void setPaymentVoucher(String paymentVoucher) {
        this.paymentVoucher = paymentVoucher;
    }

    public String getPaymentRemark() {
        return paymentRemark;
    }

    public void setPaymentRemark(String paymentRemark) {
        this.paymentRemark = paymentRemark;
    }

    public String getCancelReason() {
        return cancelReason;
    }

    public void setCancelReason(String cancelReason) {
        this.cancelReason = cancelReason;
    }

    public String getRelatedOrder() {
        return relatedOrder;
    }

    public void setRelatedOrder(String relatedOrder) {
        this.relatedOrder = relatedOrder;
    }

    public String getExtraField1() {
        return extraField1;
    }

    public void setExtraField1(String extraField1) {
        this.extraField1 = extraField1;
    }

    public String getExtraField2() {
        return extraField2;
    }

    public void setExtraField2(String extraField2) {
        this.extraField2 = extraField2;
    }

    // 2. 账单详情列表 Getter/Setter（一对多核心）
    public List<BillDetail> getBillDetails() {
        return billDetails;
    }

    public void setBillDetails(List<BillDetail> billDetails) {
        this.billDetails = billDetails;
    }


    // -------------------------- toString 方法（便于日志打印） --------------------------
    @Override
    public String toString() {
        return "AddBillDto{" +
                "id=" + id +
                ", billNo='" + billNo + '\'' +
                ", billType='" + billType + '\'' +
                ", billMonth='" + billMonth + '\'' +
                ", elderlyId=" + elderlyId +
                ", monthlyPayable=" + monthlyPayable +
                ", currentPayable=" + currentPayable +
                ", prepaymentAmount=" + prepaymentAmount +
                ", billAmount=" + billAmount +
                ", payableAmount=" + payableAmount +
                ", paymentDeadline=" + paymentDeadline +
                ", transactionStatus='" + transactionStatus + '\'' +
                ", billStartTime=" + billStartTime +
                ", billEndTime=" + billEndTime +
                ", creator=" + creator + // 打印创建人ID，便于日志排查
                ", createTime=" + createTime +
                ", paymentChannel='" + paymentChannel + '\'' +
                ", paymentMethod='" + paymentMethod + '\'' +
                ", paymentVoucher='" + paymentVoucher + '\'' +
                ", paymentRemark='" + paymentRemark + '\'' +
                ", cancelReason='" + cancelReason + '\'' +
                ", relatedOrder='" + relatedOrder + '\'' +
                ", extraField1='" + extraField1 + '\'' +
                ", extraField2='" + extraField2 + '\'' +
                ", billDetails.size=" + (billDetails != null ? billDetails.size() : 0) + // 仅打印列表长度，避免日志过长
                '}';
    }
}